package com.kakarote.hrm.service;

import com.alibaba.fastjson.JSONObject;
import com.kakarote.core.entity.BasePage;
import com.kakarote.core.entity.UploadEntity;
import com.kakarote.core.servlet.BaseService;
import com.kakarote.hrm.entity.BO.AddDeptBO;
import com.kakarote.hrm.entity.BO.DeptMoveBO;
import com.kakarote.hrm.entity.BO.QueryDeptListBO;
import com.kakarote.hrm.entity.BO.QueryEmployeeByDeptIdBO;
import com.kakarote.hrm.entity.PO.HrmDept;
import com.kakarote.hrm.entity.VO.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.*;

/**
 * <p>
 * 部门表 服务类
 * </p>
 *
 * @author huangmingbo
 * @since 2020-05-12
 */
public interface IHrmDeptService extends BaseService<HrmDept> {

    /**
     * 添加活修改部门
     *
     * @param addDeptBO
     */
    HrmDept addOrUpdate(AddDeptBO addDeptBO);

    /**
     * 查询部门详情
     *
     * @param deptId
     * @return
     */
    DeptVO queryById(Long deptId);

    /**
     * 查询部门列表
     *
     * @param queryDeptListBO
     * @return
     */
    List<DeptVO> queryTreeList(QueryDeptListBO queryDeptListBO);

    /**
     * 查询部门简要字段列表
     *
     * @param deptIds
     * @return
     */
    List<SimpleHrmDeptVO> querySimpleDeptList(Collection<Long> deptIds);

    /**
     * 查询部门简要字段
     *
     * @param deptId
     * @return
     */
    SimpleHrmDeptVO querySimpleDept(Long deptId);

    /**
     * 通过部门id查询员工列表
     *
     * @param employeeByDeptIdBO
     * @return
     */
    BasePage<QueryEmployeeListByDeptIdVO> queryEmployeeByDeptId(QueryEmployeeByDeptIdBO employeeByDeptIdBO);

    /**
     * 删除部门
     *
     * @param deptId
     */
    void deleteDeptById(String deptId);

    /**
     * 查询部门下的子部门id
     *
     * @param deptIds
     * @return
     */
    Set<Long> queryChildDeptId(Collection<Long> deptIds);

    /**
     * 查询部门下的父部门id
     *
     * @param deptId
     * @return
     */
    Set<Long> queryParentDeptId(Long deptId);

    /**
     * 查询所有部门(员工部门表单使用)
     *
     * @return
     */
    List<DeptEmployeeVO> queryDeptEmployeeList();

    /**
     * 查询该部门下所有子部门
     * @param deptId
     * @return
     */
    List<Long> selectChildrenDeptIds(Long deptId);

    /**
     * 查询该部门下所有子部门
     * @param deptIds
     * @return
     */
    List<Long> selectChildrenDeptIds(Set<Long> deptIds);

    /**
     * 部门拖拽
     * @param deptMoveBO
     */
    void deptMove(DeptMoveBO deptMoveBO);

    /**
     * 获取部门路径
     * @param employeeId
     * @return
     */
    String getDeptPathByEmployeeId(Long employeeId);

    /**
     * 获取任职部门/机构编号
     * @param employeeId
     * @param type
     * @return
     */
    Long getEmployeeDeptId(Long employeeId, String type);

    /**
     * 获取员工组织机构下所有子部门
     * @param employeeId
     * @return
     */
    Set<Long> getDeptChildrenByEmployeeId(Long employeeId);

    /**
     * 获取员工组织部门下所有子部门
     * @param employeeId
     * @return
     */
    Set<Long> getOrgChildrenByEmployeeId(Long employeeId);

    /**
     * 导出部门公司列表
     * @return
     */
    List<HrmDept> exportDeptList();

    /**
     * 导出部门
     * @param response
     * @param deptIds
     * @throws IOException
     */
    void exportExcel(HttpServletResponse response, List<Long> deptIds) throws IOException;

    /**
     * 下载导出模板
     *
     * @param response
     */
    void downloadExcel(HttpServletResponse response);

    /**
     * excel导入部门
     *
     * @param file file
     * @return data
     */
    JSONObject excelImport(MultipartFile file);


    /**
     * 上传临时文件，此文件会七天后删除
     *
     * @param file    文件对象
     * @param batchId batchId
     * @return entity
     */
    UploadEntity uploadTempFile(MultipartFile file, String batchId);

    /**
     * 获取当前部门上所属部门集合
     *
     */
    Set<Long> getParentDeptIdList(List<Long> deptId);

    /**
     * 获取部门负责人、分管领导列表
     *
     * @param employeeByDeptIdBO
     * @return
     */
    List<QueryEmployeeListByDeptIdVO> queryManageEmployeeByDeptId(QueryEmployeeByDeptIdBO employeeByDeptIdBO);

    /**
     * 部门统计树形结构
     *
     * @param pid
     * @param deptList
     * @return
     */
    List<DeptVO> createDeptTotalTree(Long pid, List<DeptVO> deptList);

    /**
     * 员工数据统计
     * @param dataTotalVO
     * @return
     */
    List<DeptEmployeeDataTotalVO> employeeDataTotal(DeptEmployeeDataTotalVO dataTotalVO);

    /**
     * 获取部门下所有员工编号
     * @param deptId
     * @return
     */
    List<Long> queryEmployeeIdListByDeptId(Long deptId);

    /**
     * 推送部门数据
     * @param deptIds
     * @return
     */
    int pushDeptData(List<Long> deptIds);

    /**
     * 更新保存在机构下面的员工部门为综合部
     */
    void updateComprehensiveDept();

    /**
     * 获取所有部门的路径
     * @return
     */
    HashMap<Long, String> getAllDeptPath();

}
